package socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/*
聊天室客户端
 */
public class Client {
    /*
    java.net.Socket套接字
    socket封装了tcp协议的通讯细节  使用它可以与远端计算机就安逸连接  并基于一个输入与另一个输出流的读写完成与远端计算机的交互
     */
    private Socket socket;

    Client() {
        try {
           /* socket的实例化需要传入两个参数
                    1 服务器IP地址 其中localhost表示本机
                    2 服务端开启的端口 这是一个整数1--65535之间

                    我们通过IP地址找到网络上服务端所在的计算机  通过端口找到该机器上运行的服务器应用程序*/
            System.out.println("正在链接服务端。。。");
            socket = new Socket("176.24.6.50", 8088);
            System.out.println("与服务端建立链接");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*
    构造器  初始化客户端
     */
    public void start() {

        try {
              /*
        启动用于读取服务端发送来消息的线程
         */
            SercerHandler sercerHandlererH = new SercerHandler();
            Thread t = new Thread(sercerHandlererH);
            t.start();

            /*
             获取一个字节输出流 通过这个输出流写出的字节都会发送给远端计算机
             */

            OutputStream out = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, "UTF-8")), true);

            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入内容   ");

            while (true) {
                String line = scanner.nextLine();
                pw.println(line);

            }

        } catch (IOException e) {
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
            }
        }

    }

    public static void main(String[] args) {
        Client client = new Client();
        client.start();
    }

    /*
      该线程负责循坏读取从服务器发送过来的消息
     */
    private class SercerHandler implements Runnable {
        public void run() {
            //通过socket获取输入流读取服务端发过来的消息
            try {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(
                                socket.getInputStream()));

                String message;
                while ((message = br.readLine()) != null) {
                    System.out.println("服务端：" + message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}